﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Секция класса
    /// </summary>
    public class ClassSectionElement : SyntaxTreeElement, ISectionElement
    {
        private bool strict;
        private TokenInfo type;
        private List<ISectionElementElement> elements;

        /// <summary>
        /// Наличие влючевого слова strict
        /// </summary>
        public bool Strict { get { return strict; } set { strict = value; } }

        /// <summary>
        /// Тип секции (public, private, var ...)
        /// </summary>
        public TokenInfo Type { get { return type; } set { type = value; } }

        /// <summary>
        /// Список элементов секции
        /// </summary>
        public List<ISectionElementElement> Elements { get { return elements; } set { elements = value; } }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Strict">нличие влючевого слова strict</param>
        /// <param name="Type">тип секции (public, private, var ...)</param>
        /// <param name="Elements">список элементов секции</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public ClassSectionElement(TokenInfo StartInfo, bool Strict, TokenInfo Type, List<ISectionElementElement> Elements, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            strict = Strict;
            type = Type;
            elements = Elements;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            bool typed = strict || (type != null);
            return string.Format("{0}{1}",
                (typed) ? string.Format("{0}{1}\r\n", (strict) ? "strict " : string.Empty, type) : string.Empty,
                Tabulate(elements.Join("\r\n")));
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            foreach (ISectionElementElement element in elements)
                yield return element;
        }
    }
}
